﻿using System;
using System.ComponentModel;
using org.se.fs.presenter.ITask.Profile;
using org.se.fs.presenter.Library;
using org.se.fs.presenter.Task.Template;

namespace org.se.fs.presenter.Task.Context
{
    public class ClientRecords : Crud, IClientRecords
    {
        public event FormEvent.FormEventHandler OnGetClientInstitutionRecordByClientId;

        protected void TriggerGetClientInstitutionRecordByClientId(FormEvent e)
        {
            if (OnGetClientInstitutionRecordByClientId != null)
                OnGetClientInstitutionRecordByClientId(this, e);
        }

        public void GetClientInstitutionRecordByClientId(UInt64 clientId)
        {
            using (var a = new BackgroundWorker())
            {
                a.DoWork += BgwGetClientInstitutionRecordByClientIdDoWork;
                a.RunWorkerCompleted += BgwGetClientInstitutionRecordByClientIdWorkerCompleted;
                a.RunWorkerAsync(clientId);
            }
        }

        #region Protected Backgroud Worker Function
        protected void BgwGetClientInstitutionRecordByClientIdDoWork(object sender, DoWorkEventArgs e)
        {
            var clientId = (UInt64)e.Argument;
            e.Result = new model.Table.ClientInstitution().GetClientInstitutionRecordByClientId(clientId);
        }

        protected void BgwGetClientInstitutionRecordByClientIdWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            TriggerGetClientInstitutionRecordByClientId(new FormEvent(true) { Value = e.Result });
        }
        #endregion

        #region Protected Overridable Function
        protected override void BgwFetchDoWork(object sender, DoWorkEventArgs e)
        {                                                                                                                                                                                                                                                                                                                                                                                                   
        }

        protected override void BgFetchRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
        }

        protected override void BgwFetchListsDoWork(object sender, DoWorkEventArgs e)
        {
            //try
            //{
            //    e.Result = model.Table.ClientRecords.GetClientRecordsLists();
            //}
            //catch (Exception ex)
            //{
            //    // Error Logs here
            //    e.Result = new DataTable();
            //    IsError = true;
            //    TriggerError(new FormEvent(true) { Exception = ex });
            //}   
        }

        protected override void BgFetchListsRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //TriggerFetchLists(new FormEvent(!IsError) { Value = e.Result });
            //IsError = false;
        }

        protected override void BgwInsertDoWork(object sender, DoWorkEventArgs e)
        {
            //var a = (DataTable)e.Argument;

            //try
            //{
            //    var clientId = Convert.ToUInt64(a.Rows[0]["client_id"].ToString());
            //    var institutionId = Convert.ToUInt64(a.Rows[0]["institution_id"].ToString());
            //    var department = a.Rows[0]["department"].ToString();
            //    var isEmployed = Convert.ToBoolean(a.Rows[0]["is_employed"].ToString());
            //    var position = a.Rows[0]["position"].ToString();
            //    var salary = Convert.ToDecimal(a.Rows[0]["salary"].ToString());
            //    var userCreateId = Convert.ToUInt64(a.Rows[0]["user_create_id"].ToString());

            //    a.Rows[0]["id"] = new model.Table.ClientRecords().Insert(clientId, institutionId, userCreateId,
            //                                                                 department, isEmployed, position, salary);

            //    if (!Convert.ToUInt64(a.Rows[0]["id"].ToString()).Equals(0))
            //    {
            //        a.Rows[0]["created_date"] = DateTime.Now;
            //        a.Rows[0]["is_active"] = true;
            //    }
            //    e.Result = a;
            //}
            //catch (Exception ex)
            //{
            //    // Error Logs here
            //    a.Rows[0]["id"] = 0;
            //    e.Result = a;
            //    IsError = true;
            //    TriggerError(new FormEvent(true) { Exception = ex });
            //}
        }

        protected override void BgInsertRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //var a = (DataTable)e.Result;
            //var id = Convert.ToUInt64(a.Rows[0]["id"].ToString());
            //TriggerInsert(new FormEvent(!id.Equals("0") && !IsError)
            //                  {
            //                      Value = a,
            //                      Exception = new Exception(id.Equals(0) ? "Insert failed." : "Insert success.")
            //                  });
            //IsError = false;
        }

        protected override void BgwUpdateDoWork(object sender, DoWorkEventArgs e)
        {
            //var a = (DataTable)e.Argument;
            //try
            //{
            //    var id = Convert.ToUInt64(a.Rows[0]["id"].ToString());
            //    var clientId = Convert.ToUInt64(a.Rows[0]["client_id"].ToString());
            //    var institutionId = Convert.ToUInt64(a.Rows[0]["institution_id"].ToString());
            //    var department = a.Rows[0]["department"].ToString();
            //    var isEmployed = Convert.ToBoolean(a.Rows[0]["is_employed"].ToString());
            //    var position = a.Rows[0]["position"].ToString();
            //    var salary = Convert.ToDecimal(a.Rows[0]["salary"].ToString());
            //    var userCreateId = Convert.ToUInt64(a.Rows[0]["user_create_id"].ToString());
            //    IsSuccess = new model.Table.ClientRecords().Update(id, clientId, institutionId, userCreateId,
            //                                                           department, isEmployed, position, salary);
            //    e.Result = a;
            //}
            //catch (Exception ex)
            //{
            //    // Error Logs here
            //    e.Result = a;
            //    IsSuccess = false;
            //    IsError = true;
            //    TriggerError(new FormEvent(true) { Exception = ex });
            //}
        }

        protected override void BgUpdateRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //TriggerUpdate(new FormEvent(IsSuccess)
            //                  {
            //                      Value = e.Result,
            //                      Exception = new Exception(!IsSuccess ? "Update failed." : "Update success.")
            //                  });
        }

        protected override void BgwDeleteDoWork(object sender, DoWorkEventArgs e)
        {
            //try
            //{
            //    var a = (DataTable)e.Argument;
            //    IsSuccess = new model.Table.ClientRecords().Delete(Convert.ToUInt64(a.Rows[0]["id"].ToString()));
            //    e.Result = a;
            //}
            //catch (Exception ex)
            //{
            //    // Error Logs here
            //    e.Result = 0;
            //    IsError = true;
            //    TriggerError(new FormEvent(true) { Exception = ex });
            //}      
        }

        protected override void BgDeleteRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //TriggerDelete(new FormEvent(IsSuccess && !IsError)
            //                  {
            //                      Value = e.Result,
            //                      Exception = new Exception(!IsSuccess ? "Update failed." : "Update success.")
            //                  });
            //IsError = false;
        }

        protected override void BgwToggleDoWork(object sender, DoWorkEventArgs e)
        {
        }

        protected override void BgToggleRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
        }
        #endregion
    }
}
